# @Time : 2024-11-02 17:47
# @Author : Fioman 
# @Phone : 13149920693
"""
Pipe: 允许两个进程之间进行双向通信,管道由两个连接对象组成,这两个对象表示管道的两端.
双向通信: 当需要两个进程之间进行双向通信的时候可以使用Pipe,它比Queue更轻量级,但是只能在两个进程之间
进行通信.适合用于需要传递简单消息或者数据对象的场景
"""
import multiprocessing
import time

"""
parentConn,childConn = multiprocessing.Pipe()
parentConn: 管道的一端,通常在父进程中使用
childConn: 管道的一端,通常在子进程中使用.
send(obj): 发送对象到管道的另外一端
recv(): 接收并返回从管道的另外一端发送来的对象
close(): 关闭连接,如果连接已经关闭再调用send或者recv 会引发EOFError,只影响本进程的conn的send和recv,
不影响对端的conn的send和recv
poll([timeout]): 如果管道中有数据可以供接收,返回True
fileno(): 返回连接对象使用的文件描述符
"""


def producer(conn):
    conn.send("Hello From Producer")
    conn.send({"name": "Fioman", "age": 18})
    conn.close()
    # conn.send("这里将发生错误,但是consumer的recv不会发生错误.")


def consumer(conn):
    time.sleep(1)
    print(f"Consumer Received: {conn.recv()}")
    print(f"Consumer Received: {conn.recv()}")


if __name__ == '__main__':
    parentConn, childConn = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=producer, args=(childConn,))
    p2 = multiprocessing.Process(target=consumer, args=(parentConn,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
